package com.vecspace.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;

import com.vecspace.exception.HException;

public class FileHelper {

	/**
	 * 覆盖顺序为：根类加载器 > 扩展类加载器 > 应用中的资源文件 > 应用所依赖的第三方jar(这也是JVM保证安全性的原则)。
	 * @param filePath
	 * @return
	 * @throws IOException  
	 * @author: wanghua
	 */
	public static String readFileText(String filePath) throws IOException{
		StringBuilder text = new StringBuilder();
		if(!filePath.startsWith("/")) {
			filePath = "/"+filePath;
		}
		URL resource = FileHelper.class.getResource(filePath);//path不以’/'开头时，默认是从此类所在的包下取资源；path  以’/'开头时，则是从ClassPath根下获取；
		if(resource == null) {
			return null;
		}
		String realPath = resource.getPath();
		realPath = URLDecoder.decode(realPath,"utf-8"); //解决路径中含有中文、空格问题
		InputStream is = null;
		BufferedReader buffReader = null;
		try {
			if(!realPath.contains("!")){//此文件在文件夹中，而不是在jar中，进行实时加载，即不进行缓存
				is = resource.openStream();
			}else{
				is = FileHelper.class.getResourceAsStream(filePath); //getResourceAsStream会对文件进行缓存
			}
			if(is == null) {
				throw new IOException("资源不存在：" + filePath);
			}
		    buffReader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
	   
		    String lineStr = buffReader.readLine();
		    while(lineStr != null){
		    	text.append(lineStr).append("\r\n");
		    	lineStr = buffReader.readLine();
		    }
	    }finally {
	    	if(buffReader != null)buffReader.close();
	    }
	    return text.toString();
	}
	
	public static InputStream openFile(String filePath) throws Exception {
		if(!filePath.startsWith("/")) {
			filePath = "/"+filePath;
		}
		URL resource = FileHelper.class.getResource(filePath);//path不以’/'开头时，默认是从此类所在的包下取资源；path  以’/'开头时，则是从ClassPath根下获取；
		if(resource == null) {
			return null;
		}
		String realPath = resource.getPath();
		realPath = URLDecoder.decode(realPath,"utf-8"); //解决路径中含有中文、空格问题
		InputStream is = null;

		if(!realPath.contains("!")){//此文件在文件夹中，而不是在jar中，进行实时加载，即不进行缓存
			is = resource.openStream();
		}else{
			is = FileHelper.class.getResourceAsStream(filePath); //getResourceAsStream会对文件进行缓存
		}
		if(is == null) {
			throw new IOException("资源不存在：" + filePath);
		}
	    return is;
	}
	
	/**获取文件的绝对路径
	 * 
	 * @param filePath
	 * @return
	 * @throws Exception 
	 * @设计者: wanghua
	 * @author: wanghua
	 */
	public static String getAbsoluteFilePath(String filePath) throws Exception {
		if(!filePath.startsWith("/")) {
			filePath = "/"+filePath;
		}
		URL resource = FileHelper.class.getResource(filePath);//path不以’/'开头时，默认是从此类所在的包下取资源；path  以’/'开头时，则是从ClassPath根下获取；
		if(resource == null) {
			return null;
		}
		String realPath = resource.getPath();
		realPath = URLDecoder.decode(realPath,"utf-8"); //解决路径中含有中文、空格问题		
		return realPath;
	}
	/**以clazz包的跟路径为基准路径，查找文件
	 * clazz所代表的class文件可以在jar中，也可以在文件夹中
	 * 如果 clazz在jar包中，则filePath也是jar包中的路径 
	 * @param filePath
	 * @return
	 * @throws IOException
	 * @author: wanghua
	 */
	public static String readFileText(Class<?> clazz, String filePath) throws Exception{
		String className = clazz.getName();
		className = className.replace('.', '/');
		if(!filePath.startsWith("/"))filePath = "/" + filePath;
		//String classPath = "/" + className + ".class";
		URL url = clazz.getResource(filePath);
		if(url == null)throw new HException("资源不存在：" + filePath);
		String realPath = url.getPath();
		InputStream is = null;
		BufferedReader buffReader = null;
		try {
			if(!realPath.contains("!")){
				is = url.openStream();//此文件在文件夹中，而不是在jar中，进行实时加载，即不进行缓存
			}else{
				is = FileHelper.class.getResourceAsStream(filePath); //在jar中,getResourceAsStream会对文件进行缓存
			}
			if(is == null) {
				throw new IOException("资源不存在：" + filePath);
			}
		    buffReader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
		    String lineStr = buffReader.readLine();
		    StringBuilder text = new StringBuilder(1024);
		    while(lineStr != null){
		    	text.append(lineStr).append("\r\n");
		    	lineStr = buffReader.readLine();
		    }
		    return text.toString();
		}finally {
			if(is!= null) {
				is.close();
			}
			if(buffReader != null) {
				buffReader.close();
			}
		}		 	   
	}
	/**
     * 递归查找文件
     * 
     * @param dir 查找的目录
     * @param result 匹配的文件存放在此队列中
     * @toFindFileName 要查找的文件名（可以包含多级目录，目录必须以/分割）
     */
    public static void findFile(File dir, List<File> result, String toFindFileName) {
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    // 递归目录
                	findFile(file, result, toFindFileName);
                } else {
                    // 判断后缀,这里可以加入其他判断
                	String filePath = file.getAbsolutePath().replace('\\','/');
                    if (filePath.endsWith(toFindFileName)) {
                        result.add(file);
                    }
                }
            }
        }
    }
}
